/**
 * 用户认证数据验证规则模块 (v1.0.0)
 * 所属架构层：数据验证层（Validation Layer）
 * 核心职责：
 * - 定义用户注册/登录接口的请求体（req.body）验证规则
 * - 提供自定义错误提示，确保前后端错误信息语义一致
 * - 通过强类型校验拦截非法输入，降低业务层异常处理成本
 * 技术依赖：Joi@17+（需与@escook/express-joi中间件版本兼容）
 * 设计原则：单一职责（仅管理用户认证相关规则）、可复用（支持多接口共享规则）
 */

// 导入Joi验证库：请求数据合法性校验的核心依赖
const joi = require('joi');
/**
 * Joi选型核心优势：
 * 1. 声明式语法：通过链式调用直观定义规则，降低代码理解成本
 * 2. 强类型约束：支持字符串、数值、布尔等基础类型及复杂结构（对象/数组）校验
 * 3. 自定义错误：可针对性覆盖默认错误提示，避免技术术语暴露给前端用户
 * 4. 扩展性：支持自定义验证函数（如手机号格式、邮箱有效性校验）
 * 生产环境配置建议：
 * - 锁定Joi版本（如package.json中指定"joi": "^17.11.0"），避免版本升级导致规则兼容问题
 * - 集成joi-extract-type生成TypeScript类型，实现"校验规则→类型定义"自动同步
 */

/**
 * 用户名验证规则
 * 业务设计背景：
 * - 限定字母数字（alphanum）：避免特殊字符（如<、>、'）导致的XSS攻击、数据库字段转义异常
 * - 长度1-10位：平衡用户记忆成本（过短易重复，过长易遗忘）与数据库存储效率（varchar(10)足够存储）
 * - 必传约束：用户名作为用户唯一标识，无默认值，必须由用户主动输入
 */
const username = joi.string()
  .alphanum() // 仅允许字母（a-z/A-Z）和数字（0-9），禁止特殊字符
  .min(1) // 最小长度1位：防止空字符串提交
  .max(10) // 最大长度10位：避免用户名过长导致前端UI排版错乱
  .required() // 标记为必传字段，缺失时触发错误
  .messages({ // 自定义错误提示：语义化描述，便于前端直接展示给用户
    'string.alphanum': '用户名仅支持字母和数字，不包含特殊字符',
    'string.min': '用户名长度不能小于1个字符',
    'string.max': '用户名长度不能超过10个字符',
    'string.empty': '用户名不能为空，请输入用户名',
    'any.required': '用户名是必填项，请补充输入'
  });

/**
 * 密码验证规则
 * 安全设计考量：
 * - 非空白字符约束（\S）：防止用户输入纯空格密码，避免登录时"看似有密码实则无"的异常
 * - 长度6-12位：平衡安全性（过短易被暴力破解，如4位密码仅10000种组合）与易用性（过长易输错）
 * - 必传约束：密码作为核心认证信息，无默认值，必须由用户主动输入
 * 生产环境安全增强建议：
 * - 强化正则规则：要求包含大小写字母+数字+特殊符号（如/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*])[\S]{6,12}$/）
 * - 增加密码强度等级返回（如"弱/中/强"），引导用户设置更安全的密码
 */
const password = joi.string()
  .pattern(/^[\S]{6,12}$/) // 正则规则：6-12位非空白字符
  .required() // 标记为必传字段
  .messages({ // 自定义错误提示：明确告知用户密码格式要求，减少试错成本
    'string.pattern.base': '密码需为6-12位非空白字符，不包含空格',
    'string.empty': '密码不能为空，请输入密码',
    'any.required': '密码是必填项，请补充输入'
  });

/**
 * 导出用户注册/登录接口的验证规则集
 * 结构说明：
 * - key为"body"：指定校验目标是HTTP请求体（req.body），与express-joi中间件的解析目标对齐
 * - value包含username和password字段：分别应用上述定义的验证规则，实现字段级精准校验
 * 复用与扩展设计：
 * - 复用场景：注册（/api/reguser）和登录（/api/login）接口共享此规则，避免重复定义
 * - 扩展场景：若后续添加"手机号登录"，可新增mobile规则并扩展该对象（如{ body: { mobile, password } }）
 * 使用方式：在路由中通过expressJoi(reg_login_schema)挂载，实现请求自动校验
 */
exports.reg_login_schema = {
  body: {
    username, // 用户名字段应用username规则
    password  // 密码字段应用password规则
  }
};

const id = joi.number().integer().min(1).required()
const nickname = joi.string().required()
const email = joi.string().email().required()

exports.update_user_info_schema = {
  body:{
    id,
    nickname,
    email
  }
}

exports.update_password_schema = {
  body:{
    oldPwd:password,
    newPwd: joi.not(joi.ref('oldPwd')).concat(password)
  }
}

const avatar = joi.string().dataUri().required().messages({
  'any.required': '头像是必填项，请补充输入'
})

exports.update_avatar_schema = {
  body:{
    avatar
  }
}